IO流技术
简介
I/O类库中使用“流”这个抽象概念。Java对设备中数据的操作是通过流的方式。表示任何有能力产出数据的数据源对象,或者是有能力接受数据的接收端对象。“流”屏蔽了实际的I/O设备中处理数据的细节。IO流用来处理设备之间的数据传输。设备是指硬盘、内存、键盘录入、网络等。
分类
流按操作数据类型的不同分为两种:字节流与字符流。
流按流向分为:输入流,输出流
字节流
InputStream
InputStream:字节输入流基类,抽象类是表示字节输入流的所有类的超类。
|
|
OutputStream
字节输出流基类,抽象类是表示输出字节流的所有类的超类。
|
|
FileInputStream
字节文件输入流,从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流。
|
|
示例:
FileOutputStream
字节文件输出流是用于将数据写入到File,从程序中写入到其他位置。
示例:
出的目的地文件不存在,则会自动创建,不指定盘符的话,默认创建在项目目录下;输出换行符时一定要写\r\n不能只写\n,因为不同文本编辑器对换行符的识别存在差异性
BufferedInputStream
字节缓冲流,字节缓冲输入流,提高了读取效率
|
|
注意,构造方法中传入的是一个InputStream对象,这里是使用了装饰器模式
BufferedOutputStream
字节缓冲输出流,提高了写出效率。同理,使用了装饰器模式
|
|
|
|
字符流
Reader
读取字符流的抽象类.
Writer
写入字符流的抽象类.
InputStreamReader
字节流转字符流,它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。它依赖于InputStream,装饰器模式
|
|
OutputStreamWriter
字节流转字符流。装饰器模式
BufferedReader
字符缓冲流,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
|
|
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")));
可以看出用了三层装饰器
BufferedWriter
同理,字符缓冲流,将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
FileReader、FileWriter
FileReader:InputStreamReader类的直接子类,用来读取字符文件的便捷类,使用默认字符编码。
FileWriter:OutputStreamWriter类的直接子类,用来写入字符文件的便捷类,使用默认字符编码。
他们封装过了,无需显示使用装饰器模式构造
可以让BufferedReader装饰它。
这是读取文件的常用方式
总结
I/O分为操作字节和字符的,基类分别是InputStream/OutStream, Reader/Writer, 抽象类,基本没有实现不能自己用
字节流:
FileInputStream/FileOutStream
可以单独读写文件的byteBufferedInputStream/BufferedOutputStream
使用了缓冲区,并且使用了装饰器模式,装饰了一个InputStream/OutputStream
字符流:
不能直接使用,一定要装饰字节流
InputStream/OutStream
InputStreamReader/OutputStreamReader
要装饰一个InputStream/OutputStream
,这和BufferedInputStream/BufferedOutputStream
一样。BufferedReader/BufferedWriter
增加了缓冲区,提高效率,但同样使用了装饰器模式,但是它装饰的是Reader/Writer
.因此,使用它时,看起来被装饰了三层。BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt")));
FileReader/FileWriter
继承自InputStreamReader/OutputStreamReader
所以他们是平级的。